Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


sbapp/kivymd/uix/dialog/dialog.py f8b3e3760b831745cf10d97aeae64e9c00a136a9 (f8b3e376) Text, 21.87 KB

T8b949e"""
Components/Dialog
=================

.. seealso::

`Material Design spec, Dialogs <https://material.io/components/dialogs>`_


.. rubric:: Dialogs inform users about a task and can contain critical
information, require decisions, or involve multiple tasks.

.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/dialogs.png
:align: center

Usage
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

.. code-block:: python

from kivy.lang import Builder

from kivymd.app import MDApp
from kivymd.uix.button import MDFlatButton
from kivymd.uix.dialog import MDDialog

KV = '''
MDFloatLayout:

MDFlatButton:
text: "ALERT DIALOG"
pos_hint: {'center_x': .5, 'center_y': .5}
on_release: app.show_alert_dialog()
'''


class Example(MDApp):
dialog = None

def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return Builder.load_string(KV)

def show_alert_dialog(self):
if not self.dialog:
self.dialog = MDDialog(
text="Discard draft?",
buttons=[
MDFlatButton(
text="CANCEL",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
MDFlatButton(
text="DISCARD",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
],
)
self.dialog.open()


Example().run()

.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/alert-dialog.png
:align: center
"""

Te6edf3__all__ Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffMDDialogTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffBaseDialogTa5d6ff"Tb4b4b4)

Tff7b72import T7ee787os

Tff7b72from T7ee787kivyT7ee787.T7ee787clock Tff7b72import Te6edf3Clock
Tff7b72from T7ee787kivyT7ee787.T7ee787coreT7ee787.T7ee787window Tff7b72import Te6edf3Window
Tff7b72from T7ee787kivyT7ee787.T7ee787lang Tff7b72import Te6edf3Builder
Tff7b72from T7ee787kivyT7ee787.T7ee787metrics Tff7b72import Te6edf3dp
Tff7b72from T7ee787kivyT7ee787.T7ee787properties Tff7b72import Tb4b4b4(
Te6edf3ColorPropertyTb4b4b4,
Te6edf3ListPropertyTb4b4b4,
Te6edf3NumericPropertyTb4b4b4,
Te6edf3ObjectPropertyTb4b4b4,
Te6edf3OptionPropertyTb4b4b4,
Te6edf3StringPropertyTb4b4b4,
Tb4b4b4)
Tff7b72from T7ee787kivyT7ee787.T7ee787uixT7ee787.T7ee787modalview Tff7b72import Te6edf3ModalView

Tff7b72from T7ee787kivymd Tff7b72import Te6edf3uix_path
Tff7b72from T7ee787kivymdT7ee787.T7ee787material_resources Tff7b72import Te6edf3DEVICE_TYPE
Tff7b72from T7ee787kivymdT7ee787.T7ee787theming Tff7b72import Te6edf3ThemableBehavior
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787behaviors Tff7b72import Te6edf3CommonElevationBehaviorTb4b4b4, Te6edf3MotionDialogBehavior
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787button Tff7b72import Te6edf3BaseButton
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787card Tff7b72import Te6edf3MDSeparator
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787list Tff7b72import Te6edf3BaseListItem

Tff7b72with Tffa657openTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3uix_pathTb4b4b4, Ta5d6ff"Ta5d6ffdialogTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdialog.kvTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"
Tb4b4b4) Tff7b72as Te6edf3kv_fileTb4b4b4:
Te6edf3BuilderTff7b72.Td2a8ffload_stringTb4b4b4(Te6edf3kv_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)


Tff7b72class T56d364BaseDialogTb4b4b4(
Te6edf3ThemableBehaviorTb4b4b4, Te6edf3MotionDialogBehaviorTb4b4b4, Te6edf3ModalViewTb4b4b4, Te6edf3CommonElevationBehavior
Tb4b4b4)Tb4b4b4:
Te6edf3elevation Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff3Tb4b4b4)
T8b949e"""
See :attr:`kivymd.uix.behaviors.elevation.CommonElevationBehavior.elevation`
attribute for more information.

.. versionadded:: 1.1.0

:attr:`elevation` is an :class:`~kivy.properties.NumericProperty`
and defaults to `3`.
"""

Te6edf3shadow_softness Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff24Tb4b4b4)
T8b949e"""
See :attr:`kivymd.uix.behaviors.elevation.CommonElevationBehavior.shadow_softness`
attribute for more information.

.. versionadded:: 1.1.0

:attr:`shadow_softness` is an :class:`~kivy.properties.NumericProperty`
and defaults to `24`.
"""

Te6edf3shadow_offset Tff7b72= Te6edf3ListPropertyTb4b4b4(Tb4b4b4(T79c0ff0Tb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4)
T8b949e"""
See :attr:`kivymd.uix.behaviors.elevation.CommonElevationBehavior.shadow_offset`
attribute for more information.

.. versionadded:: 1.1.0

:attr:`shadow_offset` is an :class:`~kivy.properties.ListProperty`
and defaults to `[0, 4]`.
"""

Te6edf3radius Tff7b72= Te6edf3ListPropertyTb4b4b4(Tb4b4b4[Te6edf3dpTb4b4b4(T79c0ff7Tb4b4b4)Tb4b4b4, Te6edf3dpTb4b4b4(T79c0ff7Tb4b4b4)Tb4b4b4, Te6edf3dpTb4b4b4(T79c0ff7Tb4b4b4)Tb4b4b4, Te6edf3dpTb4b4b4(T79c0ff7Tb4b4b4)Tb4b4b4]Tb4b4b4)
T8b949e"""
Dialog corners rounding value.

.. code-block:: python

[...]
self.dialog = MDDialog(
text="Oops! Something seems to have gone wrong!",
radius=[20, 7, 20, 7],
)
[...]

.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/dialog-radius.png
:align: center

:attr:`radius` is an :class:`~kivy.properties.ListProperty`
and defaults to `[7, 7, 7, 7]`.
"""

Te6edf3_scale_x Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3_scale_y Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff1Tb4b4b4)


Tff7b72class T56d364MDDialogTb4b4b4(Te6edf3BaseDialogTb4b4b4)Tb4b4b4:
T8b949e"""
Dialog class.

For more information, see in the
:class:`~kivymd.theming.ThemableBehavior` and
:class:`~kivy.uix.modalview.ModalView` and
:class:`~kivymd.uix.behaviors.CommonElevationBehavior`
classes documentation.
"""

Te6edf3title Tff7b72= Te6edf3StringPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
Title dialog.

.. code-block:: python

[...]
self.dialog = MDDialog(
title="Reset settings?",
buttons=[
MDFlatButton(
text="CANCEL",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
MDFlatButton(
text="ACCEPT",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
],
)
[...]

.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/dialog-title.png
:align: center

:attr:`title` is an :class:`~kivy.properties.StringProperty`
and defaults to `''`.
"""

Te6edf3text Tff7b72= Te6edf3StringPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
Text dialog.

.. code-block:: python

[...]
self.dialog = MDDialog(
title="Reset settings?",
text="This will reset your device to its default factory settings.",
buttons=[
MDFlatButton(
text="CANCEL",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
MDFlatButton(
text="ACCEPT",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
],
)
[...]

.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/dialog-text.png
:align: center

:attr:`text` is an :class:`~kivy.properties.StringProperty`
and defaults to `''`.
"""

Te6edf3buttons Tff7b72= Te6edf3ListPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
List of button objects for dialog.
Objects must be inherited from :class:`~kivymd.uix.button.BaseButton` class.

.. code-block:: python

[...]
self.dialog = MDDialog(
text="Discard draft?",
buttons=[
MDFlatButton(text="CANCEL"), MDRaisedButton(text="DISCARD"),
],
)
[...]

.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/dialog-buttons.png
:align: center

:attr:`buttons` is an :class:`~kivy.properties.ListProperty`
and defaults to `[]`.
"""

Te6edf3items Tff7b72= Te6edf3ListPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
List of items objects for dialog.
Objects must be inherited from :class:`~kivymd.uix.list.BaseListItem` class.

With type 'simple'
~~~~~~~~~~~~~~~~~~

.. code-block:: python

from kivy.lang import Builder
from kivy.properties import StringProperty

from kivymd.app import MDApp
from kivymd.uix.dialog import MDDialog
from kivymd.uix.list import OneLineAvatarListItem

KV = '''
<Item>

ImageLeftWidget:
source: root.source


MDFloatLayout:

MDFlatButton:
text: "ALERT DIALOG"
pos_hint: {'center_x': .5, 'center_y': .5}
on_release: app.show_simple_dialog()
'''


class Item(OneLineAvatarListItem):
divider = None
source = StringProperty()


class Example(MDApp):
dialog = None

def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return Builder.load_string(KV)

def show_simple_dialog(self):
if not self.dialog:
self.dialog = MDDialog(
title="Set backup account",
type="simple",
items=[
Item(text="user01@gmail.com", source="kivymd/images/logo/kivymd-icon-128.png"),
Item(text="user02@gmail.com", source="data/logo/kivy-icon-128.png"),
],
)
self.dialog.open()


Example().run()

.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/dialog-items.png
:align: center

With type 'confirmation'
~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: python

from kivy.lang import Builder

from kivymd.app import MDApp
from kivymd.uix.button import MDFlatButton
from kivymd.uix.dialog import MDDialog
from kivymd.uix.list import OneLineAvatarIconListItem

KV = '''
<ItemConfirm>
on_release: root.set_icon(check)

CheckboxLeftWidget:
id: check
group: "check"


MDFloatLayout:

MDFlatButton:
text: "ALERT DIALOG"
pos_hint: {'center_x': .5, 'center_y': .5}
on_release: app.show_confirmation_dialog()
'''


class ItemConfirm(OneLineAvatarIconListItem):
divider = None

def set_icon(self, instance_check):
instance_check.active = True
check_list = instance_check.get_widgets(instance_check.group)
for check in check_list:
if check != instance_check:
check.active = False


class Example(MDApp):
dialog = None

def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return Builder.load_string(KV)

def show_confirmation_dialog(self):
if not self.dialog:
self.dialog = MDDialog(
title="Phone ringtone",
type="confirmation",
items=[
ItemConfirm(text="Callisto"),
ItemConfirm(text="Luna"),
ItemConfirm(text="Night"),
ItemConfirm(text="Solo"),
ItemConfirm(text="Phobos"),
ItemConfirm(text="Diamond"),
ItemConfirm(text="Sirena"),
ItemConfirm(text="Red music"),
ItemConfirm(text="Allergio"),
ItemConfirm(text="Magic"),
ItemConfirm(text="Tic-tac"),
],
buttons=[
MDFlatButton(
text="CANCEL",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
MDFlatButton(
text="OK",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
],
)
self.dialog.open()


Example().run()

.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/dialog-confirmation.png
:align: center

:attr:`items` is an :class:`~kivy.properties.ListProperty`
and defaults to `[]`.
"""

Te6edf3width_offset Tff7b72= Te6edf3NumericPropertyTb4b4b4(Te6edf3dpTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4)
T8b949e"""
Dialog offset from device width.

:attr:`width_offset` is an :class:`~kivy.properties.NumericProperty`
and defaults to `dp(48)`.
"""

Tffa657type Tff7b72= Te6edf3OptionPropertyTb4b4b4(
Ta5d6ff"Ta5d6ffalertTa5d6ff"Tb4b4b4, Te6edf3optionsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffalertTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsimpleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffconfirmationTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcustomTa5d6ff"Tb4b4b4]
Tb4b4b4)
T8b949e"""
Dialog type.
Available option are `'alert'`, `'simple'`, `'confirmation'`, `'custom'`.

:attr:`type` is an :class:`~kivy.properties.OptionProperty`
and defaults to `'alert'`.
"""

Te6edf3content_cls Tff7b72= Te6edf3ObjectPropertyTb4b4b4(Tb4b4b4)
T8b949e"""
Custom content class. This attribute is only available when :attr:`type` is
set to `'custom'`.

.. tabs::

.. tab:: Declarative KV style

.. code-block:: python

from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout

from kivymd.app import MDApp
from kivymd.uix.button import MDFlatButton
from kivymd.uix.dialog import MDDialog

KV = '''
<Content>
orientation: "vertical"
spacing: "12dp"
size_hint_y: None
height: "120dp"

MDTextField:
hint_text: "City"

MDTextField:
hint_text: "Street"


MDFloatLayout:

MDFlatButton:
text: "ALERT DIALOG"
pos_hint: {'center_x': .5, 'center_y': .5}
on_release: app.show_confirmation_dialog()
'''


class Content(BoxLayout):
pass


class Example(MDApp):
dialog = None

def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return Builder.load_string(KV)

def show_confirmation_dialog(self):
if not self.dialog:
self.dialog = MDDialog(
title="Address:",
type="custom",
content_cls=Content(),
buttons=[
MDFlatButton(
text="CANCEL",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
MDFlatButton(
text="OK",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
],
)
self.dialog.open()


Example().run()

.. tab:: Declarative Python style

.. code-block:: python

from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDFlatButton
from kivymd.uix.dialog import MDDialog
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.uix.textfield import MDTextField


class Example(MDApp):
dialog = None

def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Orange"
return (
MDFloatLayout(
MDFlatButton(
text="ALERT DIALOG",
pos_hint={'center_x': 0.5, 'center_y': 0.5},
on_release=self.show_confirmation_dialog,
)
)
)

def show_confirmation_dialog(self, *args):
if not self.dialog:
self.dialog = MDDialog(
title="Address:",
type="custom",
content_cls=MDBoxLayout(
MDTextField(
hint_text="City",
),
MDTextField(
hint_text="Street",
),
orientation="vertical",
spacing="12dp",
size_hint_y=None,
height="120dp",
),
buttons=[
MDFlatButton(
text="CANCEL",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
MDFlatButton(
text="OK",
theme_text_color="Custom",
text_color=self.theme_cls.primary_color,
),
],
)
self.dialog.open()


Example().run()

.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/dialog-custom.png
:align: center

:attr:`content_cls` is an :class:`~kivy.properties.ObjectProperty`
and defaults to `'None'`.
"""

Te6edf3md_bg_color Tff7b72= Te6edf3ColorPropertyTb4b4b4(Tff7b72NoneTb4b4b4)
T8b949e"""
Background color in the (r, g, b, a) or string format.

:attr:`md_bg_color` is an :class:`~kivy.properties.ColorProperty`
and defaults to `None`.
"""

Te6edf3_scroll_height Tff7b72= Te6edf3NumericPropertyTb4b4b4(Ta5d6ff"Ta5d6ff28dpTa5d6ff"Tb4b4b4)
Te6edf3_spacer_top Tff7b72= Te6edf3NumericPropertyTb4b4b4(Ta5d6ff"Ta5d6ff24dpTa5d6ff"Tb4b4b4)

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Te6edf3WindowTff7b72.Td2a8ffbindTb4b4b4(Te6edf3on_resizeTff7b72=Tff7b72selfTff7b72.Td2a8ffupdate_widthTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsize_hint Tff7b72== Tb4b4b4[T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4] Tff7b72and Tb4b4b4(
Te6edf3DEVICE_TYPE Tff7b72== Ta5d6ff"Ta5d6ffdesktopTa5d6ff" Tff7b72or Te6edf3DEVICE_TYPE Tff7b72== Ta5d6ff"Ta5d6fftabletTa5d6ff"
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsize_hint Tff7b72= Tb4b4b4(Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwidth Tff7b72= Tffa657minTb4b4b4(Te6edf3dpTb4b4b4(T79c0ff560Tb4b4b4)Tb4b4b4, Te6edf3WindowTff7b72.Td2a8ffwidth Tff7b72- Tff7b72selfTff7b72.Td2a8ffwidth_offsetTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffsize_hint Tff7b72== Tb4b4b4[T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4] Tff7b72and Te6edf3DEVICE_TYPE Tff7b72== Ta5d6ff"Ta5d6ffmobileTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsize_hint Tff7b72= Tb4b4b4(Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwidth Tff7b72= Tffa657minTb4b4b4(Te6edf3dpTb4b4b4(T79c0ff560Tb4b4b4)Tb4b4b4, Te6edf3WindowTff7b72.Td2a8ffwidth Tff7b72- Tff7b72selfTff7b72.Td2a8ffwidth_offsetTb4b4b4)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftitleTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_spacer_top Tff7b72= T79c0ff0

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffbuttonsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffroot_button_boxTff7b72.Td2a8ffheight Tff7b72= T79c0ff0
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcreate_buttonsTb4b4b4(Tb4b4b4)

Te6edf3update_height Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffsimpleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffconfirmationTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Ta5d6ff"Ta5d6ffconfirmationTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffspacer_top_boxTff7b72.Td2a8ffadd_widgetTb4b4b4(Te6edf3MDSeparatorTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffspacer_bottom_boxTff7b72.Td2a8ffadd_widgetTb4b4b4(Te6edf3MDSeparatorTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcreate_itemsTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Ta5d6ff"Ta5d6ffcustomTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcontent_clsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffcontainerTff7b72.Td2a8ffremove_widgetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffscrollTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffcontainerTff7b72.Td2a8ffremove_widgetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8fftextTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffspacer_top_boxTff7b72.Td2a8ffadd_widgetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontent_clsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffspacer_top_boxTff7b72.Td2a8ffpadding Tff7b72= Tb4b4b4(T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ff24dpTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff16dpTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3update_height Tff7b72= Tff7b72True
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Ta5d6ff"Ta5d6ffalertTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffscrollTff7b72.Td2a8ffbar_width Tff7b72= T79c0ff0

Tff7b72if Te6edf3update_heightTb4b4b4:
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffupdate_heightTb4b4b4)

Tff7b72def Td2a8ffupdate_widthTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwidth Tff7b72= Tffa657maxTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffheight Tff7b72+ Tff7b72selfTff7b72.Td2a8ffwidth_offsetTb4b4b4,
Tffa657minTb4b4b4(
Te6edf3dpTb4b4b4(T79c0ff560Tb4b4b4) Tff7b72if Te6edf3DEVICE_TYPE Tff7b72!= Ta5d6ff"Ta5d6ffmobileTa5d6ff" Tff7b72else Te6edf3dpTb4b4b4(T79c0ff560Tb4b4b4)Tb4b4b4,
Te6edf3WindowTff7b72.Td2a8ffwidth Tff7b72- Tff7b72selfTff7b72.Td2a8ffwidth_offsetTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ffupdate_heightTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_spacer_top Tff7b72= Tff7b72selfTff7b72.Td2a8ffcontent_clsTff7b72.Td2a8ffheight Tff7b72+ Te6edf3dpTb4b4b4(T79c0ff24Tb4b4b4)

Tff7b72def Td2a8ffupdate_itemsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3itemsTb4b4b4: Tffa657listTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffbox_itemsTff7b72.Td2a8ffclear_widgetsTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffitems Tff7b72= Te6edf3items
Tff7b72selfTff7b72.Td2a8ffcreate_itemsTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffon_openTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e# TODO: Add scrolling text.
Tff7b72selfTff7b72.Td2a8ffheight Tff7b72= Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffcontainerTff7b72.Td2a8ffheight
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffon_openTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffget_normal_heightTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657floatTb4b4b4:
Tff7b72return Tb4b4b4(
Tb4b4b4(Te6edf3WindowTff7b72.Td2a8ffheight Tff7b72* T79c0ff80 Tff7b72/ T79c0ff100Tb4b4b4)
Tff7b72- Tff7b72selfTff7b72.Td2a8ff_spacer_top
Tff7b72- Te6edf3dpTb4b4b4(T79c0ff52Tb4b4b4)
Tff7b72- Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffcontainerTff7b72.Td2a8ffpaddingTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72- Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffcontainerTff7b72.Td2a8ffpaddingTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]
Tff7b72- T79c0ff100
Tb4b4b4)

Tff7b72def Td2a8ffedit_padding_for_itemTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3instance_itemTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3instance_itemTff7b72.Td2a8ffidsTff7b72.Td2a8ff_left_containerTff7b72.Td2a8ffx Tff7b72= T79c0ff0
Te6edf3instance_itemTff7b72.Td2a8ff_txt_left_pad Tff7b72= Ta5d6ff"Ta5d6ff56dpTa5d6ff"

Tff7b72def Td2a8ffcreate_itemsTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftextTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffcontainerTff7b72.Td2a8ffremove_widgetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8fftextTb4b4b4)
Te6edf3height Tff7b72= T79c0ff0
Tff7b72elseTb4b4b4:
Te6edf3height Tff7b72= Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8fftextTff7b72.Td2a8ffheight

Tff7b72for Te6edf3item Tff7b72in Tff7b72selfTff7b72.Td2a8ffitemsTb4b4b4:
Tff7b72if Tffa657issubclassTb4b4b4(Te6edf3itemTff7b72.Td2a8ff__class__Tb4b4b4, Te6edf3BaseListItemTb4b4b4)Tb4b4b4:
Te6edf3height Tff7b72+Tff7b72= Te6edf3itemTff7b72.Td2a8ffheight T8b949e# calculate height contents
Tff7b72selfTff7b72.Td2a8ffedit_padding_for_itemTb4b4b4(Te6edf3itemTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffbox_itemsTff7b72.Td2a8ffadd_widgetTb4b4b4(Te6edf3itemTb4b4b4)

Tff7b72if Te6edf3height Tff7b72> Te6edf3WindowTff7b72.Td2a8ffheightTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffscrollTff7b72.Td2a8ffheight Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_normal_heightTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffscrollTff7b72.Td2a8ffheight Tff7b72= Te6edf3height

Tff7b72def Td2a8ffcreate_buttonsTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72for Te6edf3button Tff7b72in Tff7b72selfTff7b72.Td2a8ffbuttonsTb4b4b4:
Tff7b72if Tffa657issubclassTb4b4b4(Te6edf3buttonTff7b72.Td2a8ff__class__Tb4b4b4, Te6edf3BaseButtonTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidsTff7b72.Td2a8ffbutton_boxTff7b72.Td2a8ffadd_widgetTb4b4b4(Te6edf3buttonTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────